package com.mooco.dongba.sys.service.impl;

import com.mooco.dongba.common.exception.ServiceException;
import com.mooco.dongba.common.pojo.CheckBox;
import com.mooco.dongba.common.pojo.PageObject;
import com.mooco.dongba.sys.dao.SysRoleDao;
import com.mooco.dongba.sys.dao.SysRoleMenuDao;
import com.mooco.dongba.sys.dao.SysUserRoleDao;
import com.mooco.dongba.sys.pojo.SysRole;
import com.mooco.dongba.sys.pojo.SysRoleMenuVo;
import com.mooco.dongba.sys.service.SysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.relational.core.sql.In;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class SysRoleServiceImpl implements SysRoleService {
    @Autowired
    private SysRoleDao sysRoleDao;

    @Autowired
    private SysUserRoleDao sysUserRoleDao;

    @Autowired
    private SysRoleMenuDao sysRoleMenuDao;

    @Override
    public PageObject<SysRole> findPageObjects(String name, Integer pageCurrent) {
        // 1、参数校验
        if (pageCurrent == null || pageCurrent < 1) {
            throw new IllegalArgumentException("当前页码值无效");
        }

        // 2、计算起始行
        int rowCount = sysRoleDao.getRowCount(name);
        if (rowCount == 0) {
            throw new ServiceException("没有找到对应的记录");
        }
        int pageSize = 2;
        int startIndex = (pageCurrent - 1) * pageSize;
        List<SysRole> records = sysRoleDao.findPageObjects(name, startIndex, pageSize);

        // 3、执行并返回
        return new PageObject<SysRole>(rowCount, pageSize, pageCurrent, records);
    }

    @Override
    public int deleteObject(Long id) {
        // 1、参数校验
        if (id == null || id < 1L) {
            throw new IllegalArgumentException("请先选择");
        }

        // 2、删除角色菜单关系
        sysRoleMenuDao.deleteObjectByRoleId(id);

        // 3、删除用户角色关系
        sysUserRoleDao.deleteObjectByRoleId(id);

        // 4、删除角色，并返回删除的行数
        int rows = sysRoleDao.deleteObjectById(id);
        if (rows == 0) {
            throw new ServiceException("数据可能不存在");
        }
        return rows;
    }

    @Override
    public int saveObject(SysRole entity, Integer[] menuIds) {
        // 1、数据验证
        if (entity == null) {
            throw new IllegalArgumentException("角色不能为空");
        }
        if (entity.getName().equals("")) {
            throw new IllegalArgumentException("角色名不能为空");
        }
        if (menuIds == null || menuIds.length == 0) {
            throw new IllegalArgumentException("必须为角色赋予权限");
        }

        // 2、插入角色数据
        int rows = sysRoleDao.insertObject(entity);

        // 3、插入角色菜单数据
        sysRoleMenuDao.insertObjects(entity.getId(), menuIds);
        return rows;
    }

    @Override
    public SysRoleMenuVo FindObjectById(Long id) {
        // 1、数据校验
        if (id == null || id <= 0) {
            throw new IllegalArgumentException("请先选择");
        }

        // 2、获取角色信息
        SysRoleMenuVo sysRoleMenuVo = sysRoleDao.findObjectById(id);

        // 3、获取角色菜单信息
        List<Integer> list = sysRoleMenuDao.findMenuIdsByRoleId(id);

        sysRoleMenuVo.setMenuIds(list);

        return sysRoleMenuVo;
    }

    @Override
    public int updateObject(SysRole entity, Integer[] menuIds) {
        // 1、数据验证
        if (entity == null) {
            throw new IllegalArgumentException("角色不能为空");
        }
        if (entity.getName().equals("")) {
            throw new IllegalArgumentException("角色名不能为空");
        }
        if (menuIds == null || menuIds.length == 0) {
            throw new IllegalArgumentException("必须为角色赋予权限");
        }

        // 2、更新角色数据
        int rows = sysRoleDao.updateObject(entity);

        // 3、删除角色菜单信息
        sysRoleMenuDao.deleteObjectByRoleId(entity.getId());

        // 4、重写插入新的角色菜单信息
        sysRoleMenuDao.insertObjects(entity.getId(), menuIds);

        return rows;
    }

    @Override
    public List<CheckBox> findObjects() {
        return sysRoleDao.findObjects();
    }
}
